// 论坛板块
// by indraw 2013.02.15
package bbs

import (
    "utils/util"
    "utils/mgo/bson"
	"strconv"
    "fmt"
    "time"
)


//用户分组
type Forum struct{
    Dao
    ForumData
}

//论坛动作
type ForumData struct{
    Fid int         //板块id
    Fup int         //板块上级id
    Type int        //论坛类别
    Name  string    //板块名称
    Styleid int     //模板id
    Topics int      //主题数
    Posts int       //回复
    Todayposts int  //今日发表
    Lastpost map[string]string //最后发表信息
    Description string    //论坛介绍
    Seodes string         //板块描述
    Rule  string          //板块规则
    Icon  string          //板块图标
    Moderators map[string]string     //版主
    Password string       //访问密码
    Pvcode string         //pv统计
    Directurl string      //直接跳转url
    Keyword string        //关键字
    Displayorder int      //主题排序
    Displaychild int      //显示子版块
    Displaytop int        //显示置顶
    Postcheck int         //是否帖子审核
    Postmodify int        //是否允许编辑
    Postcallback int      //是否允许回收
    Postanonymous int     //是否可以发匿名
    Postvote int          //是否可以发投票
    Postask int         //是否可以悬赏帖子
    Postorder int         //是否可以销售帖子
    Sortpost int          //是否可以主题分类
    Sortmust int          //是否必须主题分类
    Sortdisplay int       //是否显示分类
    Sortlist  int         //是否列表显示分类
    Groupvisit map[string]int     //允许浏览组
    Groupread map[string]int      //允许阅读组
    Grouppost map[string]int      //允许发表组
    Groupreply map[string]int     //允许回复组
    Groupupload map[string]int    //允许上传组
    Groupdownload map[string]int  //允许上传组
    Creditset map[string]int      //积分相关
    Warning  string       //暂停提示
    Maxonline int         //最大在线人数
    Maxoltime int         //最大在线时间
    Status    int         //状态
}

/**
 * 初始化对象
 *
 * author: indraw
 * date: 2013-02-11
 */
func newForum() *Forum {
    
    c := &Forum{
        Dao{
            c:db.C("forum"),
        },
        ForumData{
            Fid:0,         //板块id
            Fup:0,         //板块上级id
            Type:0,        //论坛类别
            Name:"",    //板块名称
            Styleid:0,     //模板id
            Topics:0,      //主题数
            Posts:0,       //回复
            Todayposts:0,  //今日发表
            Lastpost:make(map[string]string), //最后发表信息
            Description:"",    //论坛介绍
            Seodes:"",         //板块描述
            Rule:"",          //板块规则
            Icon:"",          //板块图标
            Moderators:make(map[string]string),     //版主
            Password:"",       //访问密码
            Pvcode:"",         //pv统计
            Directurl:"",      //直接跳转url
            Keyword:"",        //关键字
            Displayorder:0,      //主题排序
            Displaychild:0,      //显示子版块
            Displaytop:0,        //显示置顶
            Postcheck:0,         //是否帖子审核
            Postmodify:0,        //是否允许编辑
            Postcallback:0,      //是否允许回收
            Postanonymous:0,     //是否可以发匿名
            Postvote:0,          //是否可以发投票
            Postask:0,         //是否可以悬赏帖子
            Postorder:0,         //是否可以销售帖子
            Sortpost:0,          //是否可以主题分类
            Sortmust:0,          //是否必须主题分类
            Sortdisplay:0,       //是否显示分类
            Sortlist:0,         //是否列表显示分类
            Groupvisit:make(map[string]int),      //允许浏览组
            Groupread:make(map[string]int),       //允许阅读组
            Grouppost:make(map[string]int),       //允许发表组
            Groupreply:make(map[string]int),      //允许回复组
            Groupupload:make(map[string]int),     //允许上传组
            Groupdownload:make(map[string]int),   //允许上传组
            Creditset:make(map[string]int),       //积分相关
            Warning:"",       //暂停提示
            Maxonline:0,         //最大在线人数
            Maxoltime:0,         //最大在线时间
            Status:0,         //状态
        },
    }
    return c
}

/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *Forum) setFid( fid string ) {
    
    if m := util.CheckNumber(fid); !m {
        u.newError("请填写fid")
        return
    }
    
    u.Fid,_ = strconv.Atoi(fid)
}

/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *Forum) getFid( ) string {
        
    return strconv.Itoa(u.Fid)
}

/**
 * 写入数据库
 *
 * author: indraw
 * date: 2013-02-11
 */
func (f *Forum) add() error {
    
    //判断错误
    if err := f.ckError(); err != nil {
        return err
    }
    //判断是否重复

    //执行写入
    if  err := f.c.Insert(&f.ForumData); err != nil {
        return err
    }
    
    return nil
}

/**
 * 获取一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (f *Forum) get() error {
    //判断错误
    if err := f.ckError(); err != nil {
        return err
    }

    //执行
    if  err := f.c.Find(bson.M{"fid": f.Fid}).One(&f.ForumData); err != nil {
        return err
    }
    return nil
}


/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (f *Forum) count() int {
    //fmt.Println("user.go")
    var n int
    n,err := f.c.Find(nil).Count()
    if err != nil{
        n = 0
    }
    
    return n
}

/**
 * 获取前多少条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (f *Forum) top() []ForumData {
    //fmt.Println("user.go")
    var l []ForumData
    f.c.Find(nil).Sort("displayorder").All(&l)
    //g.c.Find(nil).Sort("order").All(&l)

    //fmt.Println(len(l))
    var l3 []ForumData
    for _,v:=range l {
        if v.Type == 0 {
            l3 = append(l3,v)
            for _,v2:=range l {
                if v2.Fup == v.Fid &&  v.Type == 0 {
                    l3 = append(l3,v2)
                }
            }

        }
    }
    return l3
}

/**
 * 更新一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (f *Forum) updateLastpost(ispost int) error {
    //fmt.Println("user.go")
    //if()
	result := &ForumData{}
    
    if  err := f.c.Find(bson.M{"fid": f.Fid}).Select(bson.M{"lastpost": 1}).One(result); err != nil {
        return err
    }
    //fmt.Println(result.Lastpost["time"])
    lasttime, _ := strconv.Atoi(result.Lastpost["time"])
    if time.Unix(int64(lasttime), 0).Format("20060102") != time.Unix(time.Now().Unix(), 0).Format("20060102") {
        fmt.Println(time.Unix(time.Now().Unix(), 0).Format("20060102"))
        if ispost == 0{
            f.c.Update(bson.M{"fid": f.Fid}, bson.M{"$inc": bson.M{"topics": 1,"posts":1},"$set": bson.M{"todayposts":0,"lastpost":&f.Lastpost}})
        }else{
            f.c.Update(bson.M{"fid": f.Fid}, bson.M{"$inc": bson.M{"posts":1},"$set": bson.M{"todayposts":0,"lastpost":&f.Lastpost}})
    
        }
    }else{
        if ispost == 0{
            f.c.Update(bson.M{"fid": f.Fid}, bson.M{"$inc": bson.M{"topics": 1,"todayposts":1,"posts":1},"$set": bson.M{"lastpost":&f.Lastpost}})
        }else{
            f.c.Update(bson.M{"fid": f.Fid}, bson.M{"$inc": bson.M{"posts":1,"todayposts":1},"$set": bson.M{"lastpost":&f.Lastpost}})
    
        }
    }
    
    return nil
}

/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (f *Forum) delete() error {
    //fmt.Println("user.go")
    
    return nil
}



